#!/bin/bash
# 解决异常结束问题：添加错误检查、完善进程管理、暴露关键日志
## 关键：导出环境变量，确保子进程继承（防止Jenkins杀死进程）
export BUILD_ID=dontKillMe
export JENKINS_NODE_COOKIE=dontKillMe  # 兼容更多Jenkins版本
## 加载必要环境变量（替代source /etc/profile，非交互式shell可能不生效）
# 直接定义需要的变量（根据实际需求添加，如MAVEN_HOME等）
export JAVA_HOME=/usr/local/jdk11  # 显式指定JDK路径（与启动命令一致）
export PATH=$JAVA_HOME/bin:$PATH
## 定义应用参数（修正变量名拼写，避免后续维护混淆）
APP_PORT=28080  # 原WARWORKPOT修正为APP_PORT，更直观
WAR_PATH=/apps/war/app.war
LOG_FILE=/apps/war/info_${APP_PORT}.log

## 1. 停止旧进程（优化逻辑：精准定位，避免误杀，暴露错误）
echo "[$(date)] 停止端口 ${APP_PORT} 的旧进程..."
# 通过端口定位进程
OLD_PID=$(ss -tlnp 2>/dev/null | grep ":${APP_PORT}" | awk -F 'pid=' '{print $2}' | awk -F ',' '{print $1}')
if [ -n "${OLD_PID}" ]; then
    echo "[$(date)] 发现旧进程PID: ${OLD_PID}，尝试终止..."
    # 杀死进程并检查结果（不隐藏错误）
    if ! kill -9 ${OLD_PID}; then
        echo "ERROR: 杀死旧进程 ${OLD_PID} 失败！"
        exit 1  # 终止脚本，避免启动新进程冲突
    fi
    # 等待进程彻底退出
    sleep 2
    if ps -p ${OLD_PID} >/dev/null; then
        echo "ERROR: 旧进程 ${OLD_PID} 仍未退出！"
        exit 1
    fi
    echo "[$(date)] 旧进程已成功停止"
else
    echo "[$(date)] 未发现端口 ${APP_PORT} 的旧进程"
fi

## 2. 检查依赖是否存在（避免启动失败）
echo "[$(date)] 检查应用依赖..."
# 检查WAR包是否存在
if [ ! -f "${WAR_PATH}" ]; then
    echo "ERROR: WAR包不存在 - ${WAR_PATH}"
    exit 1
fi
# 检查Java命令是否可用（与启动命令一致）
if [ ! -x "${JAVA_HOME}/bin/java" ]; then
    echo "ERROR: Java命令不存在 - ${JAVA_HOME}/bin/java"
    exit 1
fi

## 3. 启动新应用（保留详细日志，便于排查）
echo "[$(date)] 启动新应用，端口: ${APP_PORT}，日志: ${LOG_FILE}"
# 启动命令（确保nohup和java路径正确）
/usr/bin/nohup ${JAVA_HOME}/bin/java -jar -Dserver.port=${APP_PORT} ${WAR_PATH} > ${LOG_FILE} 2>&1 < /dev/null &
NEW_PID=$!  # 获取新进程ID

## 4. 验证启动结果（关键：确保进程真的启动成功）
echo "[$(date)] 验证应用启动状态（PID: ${NEW_PID}）..."
sleep 5  # 等待应用启动（根据实际启动时间调整，建议5-10秒）
if ps -p ${NEW_PID} >/dev/null; then
    echo "[$(date)] 应用启动成功，PID: ${NEW_PID}"
else
    echo "ERROR: 应用启动失败！查看日志："
    tail -n 50 ${LOG_FILE}  # 输出最后50行日志，暴露Java启动错误
    exit 1  # 告知Jenkins部署失败
fi